<?php
/**
 * Author:   tangxiaowen
 * Email:    846506584@qq.com
 * Date:     2019/3/12 0012
 * Describe: 订单管理类.
 */

namespace app\api\controller;

use think\db;

class Order extends Base
{
    /**
     * 获取订单应还款金额.
     *
     * @param int $orderInfo 订单信息
     */
    public function getOrderShould($orderInfo)
    {
        //检测订单是否逾期并获取逾期天数
        $isOrderOverdue = $this->isOrderOverdue($orderInfo);
        if ($isOrderOverdue) {
            //最终还款金额 = 到期应还金额 + 逾期金额
            $orderInfo['daoqiMoney'] = $orderInfo['daoqiMoney'] + $this->getOrderPenalty($orderInfo);
        }

        //获取用户部分还款金额
        $partMoney = $this->getOrderPartMoney($orderInfo);

        //获取用户豁免金额
        $reductionMoney = $this->getOrderReductionMoney($orderInfo);

        //最终还款金额
        return (int) $orderInfo['daoqiMoney'] - ($partMoney + $reductionMoney);
    }

    /**
     * 检测订单是否逾期
     *
     * @param array $orderInfo 订单信息
     * @param bool  $isLimit   是否加入系统最大可逾期天数判断
     *
     * @return int 逾期天数
     */
    public function isOrderOverdue($orderInfo, $isLimit = true)
    {
        $overtimes = date('Y-m-d', strtotime($orderInfo['YyFkTime'])).' 23:59:59';

        //检测是否逾期并返回逾期天数
        if (strtotime($overtimes) < strtotime(date('Y-m-d'))) {
            //获取逾期天数并根据是否根据系统最大可逾期天数 获取订单实际逾期天数
            $days = diffBetweenTwoDays($overtimes, date('Y-m-d'));
            if ($isLimit) {
                $systemDays = (new System())->getSystemInfo();

                return ($days > $systemDays['yuqijifeidays']) ? $systemDays['yuqijifeidays'] : $days;
            } else {
                return $days;
            }
        }

        return 0;
    }

    /**
     * 计算逾期订单逾期罚息.
     *
     * @param araay $orderInfo
     *
     * @return int 订单逾期罚息
     */
    public function getOrderPenalty($orderInfo)
    {
        //检测订单是否逾期并获取逾期天数
        $isOrderOverdue = $this->isOrderOverdue($orderInfo);
        if ($isOrderOverdue) {
            //订单逾期 返回逾期金额 订单申请金额 * 逾期天数 * 逾期利率(%)[订单逾期利率(%)/100]
            return $orderInfo['daoqiMoney'] * $isOrderOverdue * ($orderInfo['yuqililv'] / 100);
        }

        return 0;
    }

    /**
     * 获取订单部分还款的金额.
     *
     * @param int $orderInfo 订单信息
     *
     * @return int 用户借款订单部分还款金额
     */
    public function getOrderPartMoney($orderId)
    {
        $where['OrderSn'] = $orderId['OrderSn'];
        $where['Type'] = 1;

        return db('loans_hklist')->where($where)->sum('TotalMoney');
    }

    /**
     * 获取订单豁免金额.
     *
     * @param array $orderInfo 订单信息
     *
     * @return int 订单豁免金额
     */
    public function getOrderReductionMoney($orderInfo)
    {
        return (int) db('loans_applylist')->alias('a')
            ->join('xb_loans_hklist h', 'a.ID = h.ApplyID')
            ->where(['a.ID' => $orderInfo['ID'], 'h.Type' => '3'])
            ->sum('TotalMoney');
    }
}
